package interfaces

import (
	"gorm.io/gorm"
)

// 一个数据库连接所需的配置
type DatasourcesConfig struct {
	User     string
	Password string
	Host     string
	Port     uint
	Database string
}

// 表信息详情
type TableDetail struct {
	Name    string `json:"name"`
	Comment string `json:"comment"`
	// 其他附加信息，做成json字符串放此字段
	Others string `json:"others"`
}

// 字段属性配置
// 多个db方言时，不一定每个配置都有
type FieldOptions struct {
	Name string `json:"name"`
	// 类型包含了长度和精度，如int，varchar(10), decimal(10,2) 这种格式
	Type            string `json:"type"`
	IsPrimary       bool   `json:"isPrimary"`
	IsAutoIncrement bool   `json:"isAutoIncrement"`
	IsNull          bool   `json:"isNull"`
	Comment         string `json:"comment"`
	Default         string `json:"default"`
}

// 数据库信息对象
type DatabaseInfoObject struct {
	// 数据库名称
	Name string `json:"name"`
}

// 抽象数据库管理器接口
type DBManager interface {
	DBSQLExecer
	// 连接一个数据源
	ConnectDatasources(config *DatasourcesConfig) (*gorm.DB, error)
	// 创建一个数据库
	CreateDatabase(database string, options map[string]any) error
	// 删除一个数据库
	DropDatabase(database string) error
	// 获取一个ds连接的所有数据库列表
	GetDatabases() ([]DatabaseInfoObject, error)

	// 创建一个表
	CreateTable(table string, options []FieldOptions, args ...any) error
	// 修改表名
	RenameTable(oldTable string, newTable string) error

	// 获取一个数据库中所有的表
	GetTables() ([]TableDetail, error)
	// 删除表
	DropTable(table string) error

	// 添加一个字段
	AddField(table string, field FieldOptions, opts map[string]string) error
	//  修改一个字段
	UpdateField(table string, oldField string, field FieldOptions) error
	//  删除一个字段
	DeleteField(table string, field string) error

	// 获取一个表的所有字段信息列表
	GetFields(databaseName string, table string) ([]FieldOptions, error)
}

// sql通用语句执行器
type DBSQLExecer interface {
	// 执行一个原生SQL
	ExecRawSQL(sql string) ([]map[string]any, int64, error)
}
